package thread.test1BaseThread.notify;

import java.util.List;

/**
 * notify()方法和wait()方法，当前线程也必须拥有这个对象的monitor，因此调用notify()方法必须在同步块或者同步方法中进行
 * （synchronized块或者synchronized方法）
 */
public class Producer implements Runnable {
	private Object lock;
	private List list;

	public Producer(Object lock, List list) {
		this.lock = lock;
		this.list = list;
	}

	@Override
	public void run() {
		while(true){

			synchronized (lock) {
				while (list.size() >= 1) {
					try {
						//wait方法会让线程进入阻塞状态，并且会释放线程占有的锁，并交出CPU执行权限
						lock.wait();
						System.out.println("wait after----------------------");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				list.add("123");
				System.out.println("生产了123");
				//notify在多线程环境下会出现假死的情况。因为没法做到notify 的生产者还是消费者，
				//lock.notify();
				lock.notifyAll();
			}
			
		}
	}

}
